#ifndef M_AGREEMENTMANAGER_H
#define M_AGREEMENTMANAGER_H

#include <QObject>


class M_AgreementManager : public QObject
{
    Q_OBJECT
public:
    explicit M_AgreementManager(QObject *parent = nullptr);

signals:

};



#pragma pack(push, 1)

// 系统重启命令
typedef struct SystemRestart
{
    unsigned int    _Head = 2863311530; // 包头
    unsigned short  _Length = 20;       // 包长
    unsigned int    _SysID = 0;         // 目标系统ID
    unsigned char   _Type = 0x01;       // 包类型

    unsigned char   _Reserved[8] = {0}; // 保留
    unsigned char   _Check = 0x00;      // 校验位

}SystemRestart;

// 系统设置命令
typedef struct SystemSet
{
    unsigned int    _Head = 2863311530;         // 包头
    unsigned short  _Length = 245;              // 包长
    unsigned int    _SysID = 0;                 // 目标系统ID
    unsigned char   _Type = 0x02;               // 包类型

    unsigned char   _DataTrans = 0;             // 数据传输使能
    unsigned char   _FuncSet = 0;               // 辅助功能设置
    unsigned char   _GnssTypeSelect = 0;        // wd类型选择  0
    unsigned char   _TimeGnssSelect = 0;        // 时标源
    float           _GpsArmVector[3] = {0};     // GPS天线坐标
    float           _FrameEulerCps[3] = {0};    // 船体到光学基座坐标系转换角度
    float           _RotAxisDir[2] = {0};       // 转轴方向（X、Y方向分量）
    float           _BackUp[3] = {0};           // 保留

    //================  start  ========================
    // 发送模拟数据（当SimShipDuty<0.1时，将发送静态数据）
    unsigned char   _Retain = 0;                // 保留
    float           _SimEuler[3] = {0};         // 模拟船摇：纵摇幅度、横摇幅度、航向幅度
    float           _SimPosition[3] = {0};      // 模拟位置：纬度、经度、高度
    float           _SimVelocity = 0;           // 模拟航速
    float           _SimShipDuty = 0;           // 模拟船摇周期
    //=================  end  =========================

    unsigned short  _SimShipPacSta = 0;         // gd信息20Hz状态码
    unsigned short  _SimStarPacSta = 0;         // gd信息100Hz状态码
    float           _ResmRefAngle = 0;          // 编码器参考角
    float           _FrameEulerCmp[3] = {0};    // 光学基座到转台零位坐标系转换角度
    short           _ScaleFactorCorNum = 0;     // 比例因子修正数 LSB=0.1ppm
    float           _CenterArm[3] = {0};        // 天线杆臂
    float           _PidPara[3] = {0};          // 临时：PID参数调整
    unsigned char   _BackUp10[10] = {0};        // 备用
    unsigned char   _SimulationPacket[96] = {0};// 20160223增加96字节，其中64字节用来模拟包

    unsigned char   _Check = 0x00;              // 校验位

}SystemSet;

// 开始导航命令 （文件1.3.4）
typedef struct StartNavigation
{
    unsigned int    _Head = 2863311530; // 包头 固定0xAAAAAAAA
    unsigned short  _Length = 72;       // 包长
    unsigned int    _SysID = 0;         // 目标系统ID
    unsigned char   _Type = 0x03;       // 包类型


    unsigned int    _AlignTime = 0;             // 精对准时间
    unsigned char   _AlignmentMode = 0;         // 对准模式
    unsigned char   _DataUseSet0 = 0;           // 导航设置0
    unsigned char   _DataUseSet1 = 0;           // 导航设置1
    float           _NavIniPosition[3] = {0};   // 初始位置
    float           _GyroBias[3] = {0};         // 陀螺零偏
    float           _AccmBias[3] = {0};         // 加表零偏
    unsigned char   _RotatorFunSet = 0;         // 转台功能设置
    int             _ResmPosStand = 0;          // 固定的编码器位置
    unsigned char   _BackUp[12] = {0};                // 保留
    unsigned char   _Check = 0;                 // 校验


}StartNavigation;

// 结束导航命令
typedef struct StopNavigation
{
    unsigned int    _Head = 2863311530;     // 包头 固定0xAAAAAAAA
    unsigned short  _Length = 20;           // 包长
    unsigned int    _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x04;           // 包类型

    unsigned char   _Reserved[8] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验位
}StopNavigation;



// 调试设置命令
typedef struct DebugSetting
{
    unsigned int    _Head = 2863311530;     // 包头 固定0xAAAAAAAA
    unsigned short  _Length = 69;           // 包长
    unsigned int    _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x05;           // 包类型

    unsigned short  _CorrectEnable = 0;     // 修改使能
                                            // Bit0:导航数据输出间隔
                                            // Bit1:测星数据输出间隔
                                            // Bit2:最小卫星数
                                            // Bit3:转动间隔时间
                                            // Bit4:编码器参考角
                                            // Bit5:航向参考角
                                            // Bit6:FrameEulerCmp
                                            // Bit7:PID控制参数
                                            // Bit8:ImuEulerCb1b


    unsigned short  _NavDataOutInterval = 0;    // 导航数据输出周期
    unsigned short  _StarDataOutInterval = 0;   // 测星数据输出周期
    unsigned char   _MinGpsSatNum = 0;          // 最少卫星数
    unsigned short  _RotateInterval = 0;        // 转台转动间隔
    float           _ResmRefAngle = 0;          // 编码器参考角
    float           _HeadRefAngle = 0;          // 航向参考角
    float           _FrameEulerCmp[3] = {0};    // 光学基座到转台零位的欧拉角
    float           _PidParamP = 0;             // 转台PID控制参数
    float           _PidParamI = 0;             // 转台PID控制参数
    float           _PidParamD = 0;             // 转台PID控制参数
    float           _ImuEulerCb1b[3] = {0};     // 标准IMU到实际IMU的欧拉角
    unsigned char   _BackUp[4] = {0};           // 保留

    unsigned char   _Check = 0;                 // 校验

}DebugSetting;

// 读参数命令
typedef struct ReadPara
{
    unsigned int    _Head = 2863311530;     // 包头
    unsigned short  _Length = 20;           // 包长
    unsigned int    _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x06;           // 包类型

    unsigned char   _Command = 0;           // 读的命令参数类型
    unsigned char   _Reserved[7] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验


}ReadPara;

// IMU选择命令
typedef struct IMUSelect
{
    unsigned int    _Head = 2863311530;     // 包头
    unsigned short  _Length = 20;           // 包长
    unsigned int    _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x07;           // 包类型

    unsigned int    _SidSetNo = 0;          // 系统ID号
    unsigned char   _ImuSetNo = 0;          // IMU的ID号
    unsigned char   _RotSetNo = 0;          // ROT的ID号
    unsigned char   _Reserved[2] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验

}IMUSelect;

// 网络设置命令
typedef struct NetworkSetting
{
    unsigned int    _Head = 2863311530;     // 包头
    unsigned short  _Length = 20;           // 包长
    unsigned int    _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x08;           // 包类型


    unsigned char   _IP_BYTE4 = 0;          // IP地址第4字节（保留）
    unsigned char   _IP_BYTE3 = 0;          // IP地址第3字节（保留）
    unsigned char   _IP_BYTE2 = 0;          // IP地址第2字节（保留）
    unsigned char   _IP_BYTE1 = 0;          // IP地址第1字节（保留）
    unsigned char   _Reserved[4] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验


}NetworkSetting;


// 状态数据包 （文件1.4.1）
typedef struct StatusPacket
{
    unsigned int    _Head = 2863311530; // 包头
    unsigned short  _Length = 393;      // 包长
    unsigned int    _SysID = 0;         // 目标系统ID
    unsigned char   _Type = 0x11;       // 包类型


    unsigned short  _ImuID = 0;             // IMU的ID
    unsigned short  _RotID = 0;             // 转台的ID
    unsigned short  _Reserve1 = 0;          // 保留
    unsigned short  _Date = 0;              // 相对2000-1-1的积日
    unsigned int    _Time = 0;              // 状态包发送时间
    unsigned int    _NavTimeLen = 0;        // 空闲状态时：空闲时间；导航状态时：导航时间
    unsigned char   _MainTaskState = 0;     // 任务状态
                                            // 0 空闲状态
                                            // 1 建立数据文件
                                            // 2 准备导航
                                            // 3转台初始化
                                            // 4粗对准初始化
                                            // 5粗对准
                                            // 6正在导航
                                            // 7导航停止
                                            // 0x16 自主导航


    float _NavEuler[3] = {0};                 // IMU姿态角
    float _ShipEuler[3] = {0};                // 系统姿态角
    float _NavVelocity[3] = {0};              // 系统速度
    float _NavPosition[3] = {0};              // 系统位置
    float _GpsVelocity[3] = {0};              // GPS速度
    float _GpsPosition[3] = {0};              // GPS位置
    float _ShipAngleRate[3] = {0};            // 角速度
    float _ShipVelAccm[3] = {0};              // 加速度
    float _GyroBias[3] = {0};                 // 陀螺零偏（当处于转轴方向标定时表示转轴方向）
    float _AccmBias[3] = {0};                 // 加表零偏
    float _GyroIntensity [3] = {0};           // 陀螺光强
    float _StableVoltage [3] = {0};           // 稳频电压
    float _DitherSum[3] = {0};                // 抖动合频
    float _DitherDiff[3] = {0};               // 抖动差频
    float _GyroCount[3] = {0};                // 每秒角增量
    float _AccmCount[3] = {0};                // 每秒速度增量

    unsigned short  _Angle1AdcData[4] = {0};    // 保留
    unsigned short  _Angle2AdcData[4] = {0};    // 保留
    float           _AngleOutput[4] = {0};      // 保留
    short           _Temperature[12] = {0};     // 温度
                                                // 数据1-3：陀螺XYZ温度
                                                // 数据4-6：加表XYZ温度


    float           _PwmDataOut = 0;        // PWM控制占空比
    float           _ResmAngleNew = 0;      // 角编码器当前角位置
    int             _ResmAnglePos = 0;      // 角编码器当前位置采样值
    unsigned int    _ResmAngleSam = 0;      // 保留
    unsigned int    _ResmDiaoSCnt = 0;      // 编码器异常计数
    unsigned int    _ResmIndexCntSam = 0;   // 保留
    unsigned short  _RotatorRunState = 0;   // 转台旋转阶段
                                            // 0:空闲
                                            // 1:寻找参考位置
                                            // 2:转向参考位置
                                            // 0x111:正转向180度位置
                                            // 0x11:编码器180度位置
                                            // 0x112:正转向360度位置
                                            // 0x12:编码器360度位置
                                            // 0x113:负转向180度位置
                                            // 0x13:编码器180度位置
                                            // 0x114:负转向0度位置
                                            // 0x14:编码器0度位置
                                            // 0x130:正在标定
                                            // 0x30:标定完成
                                            // 0x8000:刹车

    unsigned int    _RotatorErrState = 0;   // 保留
    unsigned short  _FpgaIntTimeMax = 0;    // 1S内采样中断间隔最大值
    unsigned int    _PpsIntervalTime = 0;   // 秒脉冲时间间隔
    unsigned short  _NavRunTimeMax = 0;     // 1S内系统执行导航解算的最大时间

    unsigned char   _NetCmdFlag = 0;        // 网络命令状态
                                            // Bit0:接收过系统设置命令
                                            // Bit1:接收过导航开始命令
                                            // Bit2:接收过系统调试命令


    unsigned char   _TimeGnssSelect = 0;    //wd源及B码状态
                                            // Bit1:0
                                            // 0:自走时间
                                            // 1:时间由GPS更新
                                            // 2:时间由B更新
                                            // Bit2
                                            // 0:IMU同步
                                            // 1:IMU不同步
                                            // bit5:4
                                            // 0:星站差分1
                                            // 1:星站差分2
                                            // 2:GNSS北斗
                                            // Bit7:6
                                            // 1:GPS时间可用
                                            // 2:B码时间可用



    unsigned char   _PPSFlag = 0;           // Bit7:0
                                            // 0:星站差分1秒脉冲标志
                                            // 1:星站差分2秒脉冲标志
                                            // 2:GNSS北斗秒脉冲标志
                                            // 3:B码秒脉冲标志
                                            // 4:内部同步后的秒脉冲标志


    unsigned char   _UsedGpsSatNum = 0;     // 使用的卫星数
    unsigned int    _GpsTimUtcSecond = 0;   // wd UTC时间
    unsigned short  _GpsTimUtcYear = 0;     // wd UTC时间
    unsigned char   _GpsTimUtcMonth = 0;    // wd UTC时间
    unsigned char   _GpsTimUtcDay = 0;      // wd UTC时间
    unsigned int    _BTimUtcSecond = 0;     // B码时间
    unsigned short  _BTimUtcYear = 0;       // B码时间
    unsigned short  _BTimUtcDay = 0;        // B码时间
    unsigned int    _ImuWorkStatus = 0;     // IMU故障标志
                                            // Bit0:陀螺光强错误
                                            // Bit1:陀螺稳频错误
                                            // Bit2:陀螺合频错误
                                            // Bit3:陀螺抖频错误
                                            // Bit8:陀螺零偏错误
                                            // Bit9:加表零偏错误


    unsigned int    _Reserve2 = 0;          // 保留
    unsigned int    _Reserve3 = 0;          // 保留
    unsigned int    _Reserve4 = 0;          // 保留

    float           _GravityError[3] = {0}; // 重力扰动
    unsigned short  _GnssRevSta = 0;        // 导接收机状态
                                            // Bit0:GpsTimePacOk
                                            // Bit1:GpsVelPacOk
                                            // Bit2:GpsPosPacOk
                                            // Bit4:GpsTimeValid
                                            // Bit5:GpsVelValid
                                            // Bit6:GpsPosValid

    unsigned int    _FileErrFlag = 0;       // 文件操作状态
                                            // Bit0:Log文件创建错误
                                            // Bit1:Sam文件创建错误
                                            // Bit2:Rot文件创建错误
                                            // Bit3:Nav文件创建错误
                                            // Bit4:Sta文件创建错误
                                            // Bit5:Gps文件创建错误
                                            // Bit8:Log文件写入错误
                                            // Bit9:Sam文件写入错误
                                            // Bit10:Rot文件写入错误
                                            // Bit11:Nav文件写入错误
                                            // Bit12:Sta文件写入错误
                                            // Bit13:Gps文件写入错误
                                            // Bit16:重力文件打开错误
                                            // Bit17:SysSet文件错误
                                            // Bit18:ImuSet文件错误
                                            // Bit19:RotSet文件错误
                                            // Bit20:SysAlignSet文件错误
                                            // Bit24:Log文件写满
                                            // Bit25:Sam文件写满
                                            // Bit26:Rot文件写满
                                            // Bit27:Nav文件写满
                                            // Bit28:Sta文件写满
                                            // Bit29:Gps文件写满


    unsigned char   _SignalErr = 0;         //系统数据采样相关错误
                                            // Bit0:PPS丢失错误
                                            // Bit1:PPS周期错误
                                            // Bit2:采样脉冲丢失
                                            // Bit3:采样脉冲周期错误
                                            // Bit4:秒脉冲未同步
                                            // Bit5:IMU原始数据错误
                                            // Bit6:测角原始数据错误
                                            // Bit7:1S钟未收到采样脉冲


    unsigned char   _RotFatalErr = 0;       // 转台操作相关故障（只有重启清零）
                                            // Bit0:转台驱动器故障
                                            // Bit1:编码器故障
                                            // Bit2:编码器计数错误
                                            // Bit3:IMU状态错误
                                            // Bit4:编码器计数增量过大
                                            // Bit5:IMU故障致转台刹车
                                            // Bit6:编码器或转台驱动故障导致转台刹车
                                            // Bit7:转台已刹车

    unsigned char   _RotGeneralErr = 0;     // 转台伺服故障
                                            // Bit0:伺服跟踪差值过大
                                            // Bit1:目标角度差值过大
                                            // Bit2:PWM值过大

    unsigned char   _DataProcErr = 0;       // 数据处理故障（只有重启清零）
                                            // Bit0:采样数据无法及时处理
                                            // Bit1:Sam数据无法及时存储
                                            // Bit2:Rot数据无法及时存储
                                            // Bit3:Nav数据无法及时存储
                                            // Bit4:Sta数据无法及时存储
                                            // Bit5:Gps数据无法及时存储

    unsigned short  _ResmErrInNavCnt = 0;   // 编码器错误次数


    unsigned int    _Reserve5[3] = {0};     // 保留

    unsigned short  _RotErrInNavCnt = 0;    // 转台错误次数
    unsigned int    _Version = 0;           // 版本号(保留)
    unsigned char   _Check = 0;             // 校验


}StatusPacket;

// 执行错误数据包 (数据类型与上面不同)
typedef struct ExecError
{
    unsigned int    _Head = 2863311530;     // 包头
    unsigned int    _Length = 20;           // 包长
    unsigned short  _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x90;           // 包类型

    unsigned char   _ReturnData = 0;        // 0=Ok，others=Error Code
    unsigned char   _Reserved[7] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验


}ExecError;

// 执行正确数据包 (数据类型与上面不同)
typedef struct ExecCorrect
{
    unsigned int    _Head = 2863311530;     // 包头
    unsigned int    _Length = 20;           // 包长
    unsigned short  _SysID = 0;             // 目标系统ID
    unsigned char   _Type = 0x80;           // 包类型

    unsigned char   _Reserved[8] = {0};     // 保留
    unsigned char   _Check = 0;             // 校验

}ExecCorrect;




// 导航数据包 （100Hz串口数据包 - 数据元素 - 串口通信协议）
// RS422串口通信，波特率115200，8个数字位、1个停止位、奇校验。串口包长为45字节。
typedef struct SerialPortDataPacket
{
    unsigned char _Mark1 = 0xA1;            // 标志（0xA1）         I类信息起始标志
    unsigned char _Mark2 = 0xA2;            // 标志（0xA2）         I类信息起始标志

    unsigned char _State = 0;               // 状态                0x81：表示数据有效, 0x80：表示数据无效

    unsigned char _CourseAngle[3];          // 航向角              姿态，量化单位 180 * (2 ^ -21)  (°)
    unsigned char _PitchAngle[3];           // 纵摇角              姿态，量化单位 180 * (2 ^ -23)  (°)
    unsigned char _RollAngle[3];            // 横摇角              姿态，量化单位 180 * (2 ^ -23)  (°)
    unsigned char _longitude[4];            // 经度                位置，量化单位 90 * (2 ^ -29)  (°)
    unsigned char _latitude[4];             // 纬度                位置，量化单位 45 * (2 ^ -29)  (°)
    unsigned char _elevation[3];            // 高程                位置，量化单位 0.01m

    unsigned char _EastSpeed[2];            // 东速               速度，量化单位0.01节
    unsigned char _NorthSpeed[2];           // 北速               速度，量化单位0.01节
    unsigned char _HighSpeed[2];            // 高速               速度，量化单位0.01m/s

    unsigned char _CourseAngleSpeed[2];      // 航向角速度          量化单位0.01°/s
    unsigned char _PitchAngleSpeed[2];       // 纵摇角速度          量化单位0.01°/s
    unsigned char _RollAngleSpeed[2];        // 横摇角速度          量化单位0.01°/s


    unsigned char _Year[2];                 // UTC时间-年          量化单位1年
    unsigned char _Month;                   // UTC时间-月          量化单位1月
    unsigned char _Day;                     // UTC时间-日          量化单位1日
    unsigned char _Sec[4];                  // UTC时间-秒          量化单位0.001s

    unsigned char _Check;                   // 和校验              1-43字节求和
    unsigned char _MarkEnd = 0xBF;          // 标志（0xBF）

}SerialPortDataPacket;



struct GNSSDisplayData
{
    int ipFlag;//1~3分别对应IP1~IP3
    double time;//时间
    QString sateNumStr;//卫星数
    unsigned char sateNum;
    QString statusStr;//状态
    //位置
    double longi;
    double lati;
    double height;
    //东北天速度
    double eastSpeed;
    double northSpeed;
    double SkySpeed;
    //xyz位置
    double positionX;
    double positionY;
    double positionZ;
    //XYZ速度
    double SpeedX;
    double SpeedY;
    double SpeedZ;
    //PODP值
    double eastPDOP;
    double northPDOP;
    double SkyPDOP;
    //UTC跳秒
    double UTCJumpSec;
    //定位频率
    int positionRate;
    GNSSDisplayData() {}
};



#pragma pack(pop)




#endif // M_AGREEMENTMANAGER_H










